use std::os;
+use rustc_serialize::{Decodable, Decoder};
use cargo::ops;
use cargo::core::MultiShell;
use cargo::util::{CliResult, CliError};
+#[deriving(Show, PartialEq)]
+enum VersionControl { Git, Hg, NoVcs }
+
+impl<E, D: Decoder<E>> Decodable<D, E> for VersionControl {
+ fn decode(d: &mut D) -> Result<VersionControl, E> {
+ Ok(match try!(d.read_str()).as_slice() {
+ "git" => VersionControl::Git,
+ "hg" => VersionControl::Hg,
+ "none" => VersionControl::NoVcs,
+ n => {
+ let err = format!("could not decode '{}' as version control", n);
+ return Err(d.error(err.as_slice()));
+ }
+ })
+ }
+}
+
#[deriving(RustcDecodable)]
struct Options {
flag_verbose: bool,
flag_bin: bool,
flag_travis: bool,
- flag_hg: bool,
- flag_git: bool,
- flag_no_git: bool,
arg_path: String,
+ flag_vcs: Option<VersionControl>,
}
pub const USAGE: &'static str = "
Options:
-h, --help Print this message
- --no-git Don't initialize a new git repository
- --git Initialize a new git repository, overriding a
- global `git = false` configuration
- --hg Initialize a new hg repository
+ --vcs <vcs> Initialize a new repository for the given version
+ control system (git or hg) or do not initialize any version
+ control at all (none) overriding a global configuration.
--travis Create a .travis.yml file
--bin Use a binary instead of a library template
-v, --verbose Use verbose output
debug!("executing; cmd=cargo-new; args={}", os::args());
shell.set_verbose(options.flag_verbose);
- let Options { flag_no_git, flag_travis,
- flag_bin,arg_path, flag_git, flag_hg, .. } = options;
+ let Options { flag_travis, flag_bin, arg_path, flag_vcs, .. } = options;
let opts = ops::NewOptions {
- no_git: flag_no_git,
- git: flag_git,
- hg: flag_hg,
+ no_git: flag_vcs == Some(VersionControl::NoVcs),
+ git: flag_vcs == Some(VersionControl::Git),
+ hg: flag_vcs == Some(VersionControl::Hg),
travis: flag_travis,
path: arg_path.as_slice(),
bin: flag_bin,
test!(simple_lib {
os::setenv("USER", "foo");
- assert_that(cargo_process("new").arg("foo").arg("--no-git"),
+ assert_that(cargo_process("new").arg("foo").arg("--vcs").arg("none"),
execs().with_status(0));
assert_that(&paths::root().join("foo"), existing_dir());
fs::mkdir(&root.join(".cargo"), USER_RWX).unwrap();
File::create(&root.join(".cargo/config")).write_str(r#"
[cargo-new]
- git = false
+ vcs = "none"
name = "foo"
email = "bar"
"#).unwrap();
- assert_that(cargo_process("new").arg("foo").arg("--git").cwd(td.path().clone())
+ assert_that(cargo_process("new").arg("foo").arg("--vcs").arg("git").cwd(td.path().clone())
.env("USER", Some("foo")),
execs().with_status(0));
assert!(td.path().join("foo/.gitignore").exists());